// 包声明：将Test类放在com.itheima.thisdemo包下，用于组织和管理代码
package com.itheima.thisdemo;

// 定义公共的Test类，public表示这个类可以被其他包的类访问
public class Test {
    // 定义公共的静态main方法，这是程序的入口点
    // String[] args是命令行参数数组，用于接收运行程序时传入的参数
    public static void main(String[] args) {
        // 第一个测试：创建有名字的学生对象，演示this指向
        // 创建一个Student类的对象，使用new关键字调用构造方法
        Student s1 = new Student();
        // 为s1对象的name成员变量赋值为"张三"
        s1.name = "张三";
        // 调用s1对象的print方法，此时方法中的this指向s1对象
        s1.print();
        // 直接打印s1对象的引用地址，可以与print方法中this的打印结果对比
        // 可以看到两者是相同的，证明this确实指向当前调用方法的对象
        System.out.println(s1);

        // 分隔线，用于区分不同的测试部分
        System.out.println("==========================");

        // 第二个测试：创建没有名字的学生对象，演示this指向
        // 创建第二个Student对象
        Student s2 = new Student();
        // 调用s2对象的print方法，此时方法中的this指向s2对象
        // 由于没有给name赋值，this.name会是默认值null
        s2.print();
        // 直接打印s2对象的引用地址，与print方法中this的打印结果对比
        System.out.println(s2);

        // 分隔线，用于区分不同的测试部分
        System.out.println("==========================");

        // 第三个测试：演示this解决变量名冲突的场景
        // 创建第三个Student对象
        Student s3 = new Student();
        // 为s3对象的name成员变量赋值为"汪苏泷"
        s3.name = "汪苏泷";
        // 调用s3对象的printHobby方法，传入参数"唱歌！"
        // 此时方法中的this.name访问的是成员变量（值为"汪苏泷"）
        // 而方法参数name访问的是局部变量（值为"唱歌！"）
        s3.printHobby("唱歌！");
    }
}
